<?
/*第四章 字符串操作与正则表达式*/
/*4.1创建一个智能表单邮件*/
echo "<a href=\"feedback.html\">点击此处进入该页面</a>";
echo "发送失败了，配置问题。";


/*字符串的格式化
chop();ltrim();trim();rtrim();
*/

$a="   111  <55>";
$b="   111  <55> ";
echo $a;
echo "<br />这是末尾没有空格的格式化之后是这样".trim($a,"<55>");//注：只能去掉开头和结尾的东西
echo "<br />这是末尾有空格的格式化之后是这样".trim($b,"<55>");//注：只能去掉开头和结尾的东西,有空格就不管用了
//ltrim();只去掉左边
//rtrim();只去掉左边，chop()为rtrim()的别名

/*4.2.2格式化字符串以便于显示nl2br()*/
$name="Kevin";
$mail="436081860@qq.com";
$feedback="very good";
$mailcontent=$name."\n".$mail."\n".$feedback."\n";
echo $mailcontent;
echo nl2br($mailcontent);

$c=array(1,2);
/*print($c);//不能打印数组*/
$d=20;
//print($e);
echo (print($d));
//echo $e;
//print($e);

/*printf和sprintf*/
$e=26.32999;
echo "<br />这本书的价格是￥$e"."。<br />";
printf("这本书的价格是￥%s。<br />",$e);
printf("%%这本书的价格为￥%.2f<br />",$e);
printf("打印前面3个空格左对齐的第三个参数保留三位小数点：%3\$'3 6.3f",$a,$b,$e);
printf("打印前面3个空格左对齐的第三个参数保留三位小数点：%3\$'6-10.3f",$a,$b,$e);//向左靠齐时才会填充3，有些type没搞明白s字符串 f双精度

/*字符串的大小写*/
$f="hello,world!I'm a new soul!";
echo "<br />".strtoupper($f)."<br>".strtolower($f)."<br>".ucfirst($f)."<br>".ucwords($f)."<br>";
/*奇怪的是加了中文英文逗号的，竟然没有大写？*/

/*格式化字符串以便于储存*/
$g="\"哈哈！\"";
echo $g."<br />";
echo addslashes($g);


/*4.3使用函数链接和分割字符串*/
/*4.3.1explode(),implode(),join()*/
//print_r($email);
$email="436081860@qqlUhao.com";
$email_array=explode('@',$email);
//print_r($email_array); 
if(strtolower($email_array[1])=='qqluhao.com'){
	echo "1";
	}else{
		echo "0";
		}
/*将数组的元素组成新的字符串join()是implode()函数的别名*/
$email_array[3]="3";
$new_email_array=implode('@',$email_array);
echo strtolower($new_email_array);
$new_email_array2=join('@',$email_array);
echo $new_email_array2;
echo "<br />";
/*4.3.2使用strtok函数*/
$string = "abcd efgh igkelmn opeq ers e  e t"; 
echo "$string<br />";
$str=explode("e",$string);
foreach($str as $v){
	echo "($v)";
	}
echo "-------------<br />";

$string2 = "rrrrrdrr rrrrbrbrbrbbrbrb"; 
$str2 = strtok($string2, " d"); 
$n=1; 
while ($str2 !== false) { 
echo "($str2)"; 
$str2 = strtok("r"); 
} 
echo "-------------<br />";

//上面的意思是先把string2从左到右读，碰到的第一个分割字符（d）就停止，后面的循环是按照（r）来切割的。
$string3="aaaaaaabcbcbcbcbbcbddddddod";
$str3=strtok($string3,"bcdef");//第一次切,实际上只执行了b
while($str3!==false){
	echo "($str3)";
	$str3=strtok("o");//分割后面的o,结果应该是三个括号
		}

//使用for来遍历
echo "<br>";
$string4="aaaaobbbboccccoddddo";
for($i=strtok($string4,"o");$i!==false;$i=strtok("o")){
	echo "($i)";
	}
echo "<br />";
//使用for来遍历string3【推荐用法】
for($i=strtok($string3,"bcdef");$i!==false;$i=strtok("o")){
	echo "($i)";
	}


/*使用substr()函数*/
$test="Your customer service is excellent.";
echo substr($test,1,-2);//第三个元素如果为正数就是长度，如果为负数，就是从末尾数的数值。

/*字符串的比较*/
$h="abcdefg";
$i="Abcdefg";
$j="abc";
$k="123456";
$l="23456";
echo "<br />";
echo strcmp($h,$i);//比较最严格
echo strcmp($h,$j);
echo strcasecmp($h,$i);//忽略大小写
echo strcasecmp($k,$l);
echo strnatcmp($h,$l);//按照自然排序
echo strnatcmp($k,$l);

/*字符串的长度*/
$m="howroad";
echo "<br />howroad的长度为".strlen($m);//一般的作用就是来判断

/*字符串的匹配和替换*/
$teststr="it's very good.i very like it.i want BUY more.BUY moremore";
echo (strstr($teststr,"good") ? "有" :"无") ;
echo (strstr($teststr,"buy") ? "有" :"无") ;
echo (stristr($teststr,"buy") ? "有" :"无") ;
echo strrchr($teststr,"BUY");

/*查找字符串的位置*/
echo strpos($teststr,"good");
echo strpos($teststr,"o");
echo strpos($teststr,"o",12);
echo "<br />".strrpos($teststr,"o",12);

//假如搜索不到
echo @strpos($testpos,'aaaaa');
echo $php_errormsg;
//对比两个判断
if(strstr($teststr,'aaaaa')==0){echo "不存在";}
if(strstr($teststr,'i')==0){echo "存在";}
//有漏洞，应使用恒等于
if(strstr($teststr,'aaaaa')===false){echo "不存在";}
if(strstr($teststr,'i')==0){echo "存在";}

/*替换*/
/*
str_replace();
substr_replace();
*/
$offset=array("fuck","bitch","dick","cock");
$teststr="you son of bitch,fuck you ,you are dick!";
print_r(str_replace($offset,'******',$teststr,$i));//哈哈哈哈哈成功
echo $i;//显示一共替换了几处
echo substr_replace($teststr,"(没有全部替换)",0,-1);
echo substr_replace($teststr,"(全部替换了)",0,10000);

/*4.6正则表达式*/
//正则表达式是用来检索、替换那些符合某个模式（规则）的文本。
/*4.6.2*/
/*
[a-z][A-Z][a-zA-Z][^a-z][aeiou]
*/
echo(preg_match('/[a-z]$|[0-9]$/',"1o1")==true? "符合" : "不符合");

/*4.6.3重复*/
//*表示 这个模式可以被重复0或者更多次
//+表示 这个模式可以被重复1或者更多次


/*4.6.4子表达式*/
//类似于这种(very )*large
//for example ^bob,com$,^[a-z]$,


/*4.6.7分支*/
//| means or
//for example com|net|cn


/*4.6.8匹配特殊字符*/
//实例
echo "\\ <br />";
$ii="\$";
echo(preg_match("/[\\$]/",$ii)==true?"符合":"不符合");
//in the 正则表达式,双引号之中的特殊字符需要三个反斜杠\\\


/*4.6.9特殊字符一览表*/

/*4.6.10在智能表单中的应用*/
//使用正则表达式对电子邮箱中的地址标准格式进行编码
//^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-]+$


/*4.7用正则表达式来查找字符串（这是正则表达式的主要应用）*/

$email="436081860@qq.com";
echo "<br />";
if(preg_match('/^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/',$email)==true){
	echo "符合格式";
	}else{
		echo "不符合格式";
		}
/*
			┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
			┃					★★★★★特大喜讯★★★★					┃
			┃			本单元所学的正则表达式在PHP更新到5.3之后就不建议使用了！	┃
			┃				要重新学习PCRE格式比较好，MLGBD！				┃
			┃			http://php.net/manual/zh/book.pcre.php			┃
			┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
1.PCRE 函数需要模式以分隔符闭合。
2.不像POSIX，PCRE 扩展没有专门用于大小写不敏感匹配的函数。取而代之的是，支持使用i (PCRE_CASELESS) 模式修饰
符完成同样的工作。 其他模式修饰符同样可用于改变匹配策略。
3.POSIX 函数从最左面开始寻找最长的匹配，但是 PCRE 在第一个合法匹配后停止。如果字符串 不匹配这没有什么区别，但
是如果匹配，两者在结果和速度上都会有差别。 为了说明这个不同, 考虑下面的例子(来自Jeffrey Friedl 的《精通正则
表达式》一书)。 使用模式 one(self)?(selfsufficient)? 在字符串oneselfsufficient 上匹配，PCRE 会匹配到o
neself，但是使用 POSIX，结果将是整个字符串 oneselfsufficient。 两个子串都匹配原始字符串，但是 POSIX 将 最
长的作为结果。
*/
	//echo phpinfo();是5.5版本的。。。

//补充正则表达式｛8｝标识循环8次

?>